Kriticke sekce na vice-proc. serveru, predani socketu do jine aplikace

Otázka od: Jaroslav Bruzek

8. 7. 2004 9:16

Zdarec,

mam aplikaci, ktera bezi na 2*Xeonech (tzn. celkem 4 jadra), ma otevrenej
jeden port, spousti max. 800 Threadu, ktery si mezi sebou vymenuji data
pomoci kritickych sekci. Vse funguje perfektne, ale tato aplikace nedovede
vytizit procesory na vice jak cca. 33% (vytizeni je rovnomerne na vsechny
proc.), pokud vsak spustim jeste jednu instanci, ktera posloucha na jinym
portu, tak ziskam dalsich 33%.

Myslel jsem si, ze mam mezi vlaknama nejaky slaby misto, ale vse je OK, i
synchronize volam minimalne. Jsem ochotnej pripustit, ze hodne vlaken(cca.
800) a kritickych sekci (cca.100) nefunguje na vice-procesorovych serverech
zrovna nejlip, klidne bych prekousl i spusteni vice instanci, ale byl bych
rad, aby vsechny 3 instance "poslouchali" na jednom portu. Tzn. aby jedna
poslouchala a podle potreby by vytvoreny socket predala jine aplikaci.
Zkousel jsem predat handle socketu do jine aplikace, ale tam jej windows uz
neznaji.

Existuje nejaky reseni, jak si predat socket do jine aplikace? Setkal se
nekdo s podobnym problemem?


Moooc, moooc diiiik
J.B.


Odpovedá: delphin@post.cz

8. 7. 2004 13:11

         aplikace
> mam aplikaci, ktera bezi na 2*Xeonech (tzn. celkem 4 jadra), ma otevrenej
> jeden port, spousti max. 800 Threadu, ktery si mezi sebou vymenuji data
> pomoci kritickych sekci. Vse funguje perfektne, ale tato aplikace nedovede
> vytizit procesory na vice jak cca. 33% (vytizeni je rovnomerne na vsechny
> proc.), pokud vsak spustim jeste jednu instanci, ktera posloucha na jinym
> portu, tak ziskam dalsich 33%.

Jestlize pomuze spustit dve instance, je zrejme chyba v aplikaci, protoze
neni duvod, aby si aplikace neumela vzit vic, nez 4*33%.
Od boku bych to tipoval na chybny navrh vlakna, co posloucha na portu.
Vlakno by melo mit nastavenu vyssi prioritu a jenom prijimat pozadavky a
vytvaret dalsi vlakna.
V celem projektu je nutno zvazit pouziti funkci jako sleep a synchronize.


Odpovedá: Jaroslav Bruzek

8. 7. 2004 13:49

         aplikace
> > mam aplikaci, ktera bezi na 2*Xeonech (tzn. celkem 4 jadra), ma
> otevrenej
> > jeden port, spousti max. 800 Threadu, ktery si mezi sebou vymenuji data
> > pomoci kritickych sekci. Vse funguje perfektne, ale tato
> aplikace nedovede
> > vytizit procesory na vice jak cca. 33% (vytizeni je rovnomerne
> na vsechny
> > proc.), pokud vsak spustim jeste jednu instanci, ktera
> posloucha na jinym
> > portu, tak ziskam dalsich 33%.


> Jestlize pomuze spustit dve instance, je zrejme chyba v aplikaci, protoze
> neni duvod, aby si aplikace neumela vzit vic, nez 4*33%.
> Od boku bych to tipoval na chybny navrh vlakna, co posloucha na portu.
> Vlakno by melo mit nastavenu vyssi prioritu a jenom prijimat pozadavky a
> vytvaret dalsi vlakna.
> V celem projektu je nutno zvazit pouziti funkci jako sleep a synchronize.

Hlavni vlakno (to co posloucha a vytvari dalsi thready) je vytizeny
minimalne, vytvori v prumeru cca. 5 threadu/min. a ikdyby se na nej
nedostala rada, tak se dalsi klienti max. neprihlasi => timhle to neni. Spis
bych opravdu videl chybu nekde v kritickych sekcich, treba pri > poctu
dochazi k narustu rezie pro provoz threadu. Podle toho jak to sleduju dojde
pri zatizeni procesoru na 33% k velkym prodlevam pri vstupu do kriticke
sekce. Misto sleep pouzivam WaitForSingle(Multiple)Object s hooodne velkym
timeoutem, synchronize pouzivam minimalne a synchronizovana sekce je opravdu
nenarocna. Zvlast me zarazi, ze na 1 proc. serveru se mi to i pri podobne
zatezi nepovedlo nasimulovat.

Nevylucuji vsak ze tam mam neco blbe ja, ale musim ted co nejdriv najit
nejschudnejsi cestu. Proto bych potreboval vedet, jak predat socket jine
aplikaci a jak budu mit cas, tak se v tom muzu stourat.


Odpovedá: Cizek Milan

8. 7. 2004 17:24

         aplikace
> mam aplikaci, ktera bezi na 2*Xeonech (tzn. celkem 4 jadra),
> ma otevrenej jeden port, spousti max. 800 Threadu, ktery si
> mezi sebou vymenuji data pomoci kritickych sekci. Vse funguje
> perfektne, ale tato aplikace nedovede vytizit procesory na
> vice jak cca. 33% (vytizeni je rovnomerne na vsechny proc.),
> pokud vsak spustim jeste jednu instanci, ktera posloucha na
> jinym portu, tak ziskam dalsich 33%.

Ahoj,
ja bych to spis tipoval na chybu nekde v urceni CPU. Pouzivas
SetThreadAffinityMask? Pokud ne, zkusil bych jednotlivym vlaknum nastridacku
pridelovat jednotlive procesory. Alespon na P4 s HT mi to tak fungovalo.
Pokud jsem si to sam nerozhodil, cinilo vytizeni "obou CPU" v souctu onech
100%.

Kdzytak se podivej na SetProcessAffinityMask/SetThreadAffinityMask.

Mala ukazka na (dole): http://milanc.chvalsiny.net/hratky.php

S pozdravem Milan Cizek, amatersky programator, D7 Ent
Win2k (SP3) a WinXP, cizek.milan@seznam.cz, ICQ: 59826637